iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0

https://ithelp.ithome.com.tw/upload/images/20210905/20128604A6YTGzNFPq.jpg

Map是JavaScript ES6中新增的資料結構 ,類似於object ,不過Map還是跟object有著以下的差異:

  1. Map的key是可以是原始型別、物件、函式,而object的key限定為string、 symbol
  2. Map為array-like (類陣列)所以可以使用array的方法,像是forEach等等
  3. Map中的keys會根據被添加的時間而有順序性,而Object則沒有順序性
  4. 假如需要頻繁的新增刪除屬性時,Map的效能會比Object更好

如何宣告一個新的Map

let map = new Map()

//也可以在宣告的時候就賦值,傳入[key , value]
let map = new Map([
  ["amber", 18],
  ["shane", 33],
]);

Map.set(key, value) 

新增key-value pairs(鍵值對),如果key已經存在,舊的值會被新的值覆蓋

//第一個值傳入key 第二個值傳入value
map.set('tom', 28);
map.set('jason', 27);

因為set會回傳map的本身,所以可以使用chaining(鏈)的寫法

let map = new Map()
  .set('jay', 13)
  .set('ban', 23)
  .set('luna', 49);

Map.get(key)

用key來獲取value,如果沒有這個key會回傳undefined

map.get('tom'); //get 28

Map.size()

獲取Map的長度

map.size // get 2

Map.has(key)

檢查Map是否擁有該key,會回傳boolean值

map.has('tom') // true or false

Map.delete(key)

刪除Map的某個key,如果刪除成功會回傳true,失敗則是false

map.delete('tom') // true or false

Map.clear()

清除Map所有的鍵值對,不會回傳值

map.clear('tom')

Map Iteration (迭代)

  • Map.keys() :回傳map所有的key
  • Map.values():回傳map所有的value
  • Map.entires():回傳map每個元素的[key, value]的鍵值對
let map = new Map([
  ["amber", 18],
  ["shane", 33],
]);
map.keys() // {'amber', 'shane'}
map.values() // {18, 33}
map.entires() // {"amber" => 18, "shane" => 33}

可以搭配for of或forEach來遍歷map

//for of
for(let [key, value] of map){
    console.log('key', key, 'value', value)
}

//forEach 
map.forEach((value, key) => {
   console.log('key', key, 'value', value)
})

將map轉成陣列

//....擴展運算子
[...map.keys()] // ["amber", "shane"]

WeakMap

WeakeMap結構類似於Map,只接受object作為key,不接受其它類型的值,不支援迭代的方法ex. keys()、values()、entries()等等,WeakMap的key為弱引用,當作為key的object在其它地方沒有被引用的時候,就會被js垃圾回收機制自動回收,整個鍵值對都會消失。

let weakMap = new WeakMap()
weakMap.set('mark', 19)
//Invalid value used as weak map key 


let obj = {name: 'mark'}
weakMap.set(obj, 5)
//correct

參考資料:MDN


上一篇
Day4: [資料結構] Array —  陣列
下一篇
Day6: [資料結構] -  Set
系列文
每日攝取一點資料結構和演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言